package br.gov.ibama.server;

import java.util.List;
import java.util.Map;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import br.gov.ibama.client.AuthService;
import br.gov.ibama.client.constantes.ConstantesDS;
import br.gov.ibama.shared.Usuario;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.isomorphic.datasource.DSRequest;

@SuppressWarnings("serial")
public class AuthServiceImpl extends RemoteServiceServlet implements AuthService {

    public String retrieveUsername(){        
        Authentication authentication =
            SecurityContextHolder.getContext().getAuthentication();
        
        if (authentication==null){
            return null;
        }
        else {
            return (String) authentication.getPrincipal();
        }
        
    }
    
	private static final String USUARIO_DA_SESSAO = "usuarioDaSessao";

	/**
	 * Efetua o login e coloca o usuário na sessão
	 */
	public void logar(final Usuario usuario) throws IllegalArgumentException{
		if( usuario == null || usuario.getLogin() == null || usuario.getSenha() == null){
			throw new IllegalArgumentException("Login e/ou senha inválidos");
		}else{
			try {
				List<Map<String, Object>> dataList = new DSRequest()
					.setDataSourceName(ConstantesDS.DS_USUARIO) //Retirei DS_FUNCIONARIO e coloquei DS_USUARIO
					.setOperationType("fetch")
					.execute()
					.getDataList();
				if (dataList != null && !dataList.isEmpty()) {
					boolean loginValido = false;
					for (Map<String, Object> registro : dataList) {
						if(registro.get("matricula").toString().equals(usuario.getLogin()) 
								&& registro.get("senhaPrincipal").equals(usuario.getSenha())) {
							loginValido = true;
							usuario.setPerfil(Integer.parseInt(registro.get("perfil").toString()));
							break;
						}
					}
					if (loginValido) {
							//o trecho abaixo coloca o objeto usuário na sessão
							getThreadLocalRequest().getSession().setAttribute(USUARIO_DA_SESSAO, usuario);							
					} else {
						throw new IllegalArgumentException("Login e/ou senha inválidos");
					}
				} else {
					throw new IllegalArgumentException("Não há usuários cadastrados no banco de dados!");
				}
			} catch (Exception e) {
				throw new IllegalArgumentException(e.getMessage());
			}
		}
	}
	
	/**
	 * Método para efetuar o logout
	 */
	public void logout(){
		//destroy a sessão atual
		getThreadLocalRequest().getSession().invalidate();
	}
    
	public Usuario getUsuarioDaSessao(){
		return (Usuario) getThreadLocalRequest().getSession().getAttribute(USUARIO_DA_SESSAO);
	}
}